/*************************************************************************************
 * Copyright (C) 2016, Huada Semiconductor Co.,Ltd All rights reserved.
 *
 * This software is owned and published by:
 * Huada Semiconductor Co.,Ltd ("HDSC").
 *
 * BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
 * BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
 *
 * This software contains source code for use with HDSC
 * components. This software is licensed by HDSC to be adapted only
 * for use in systems utilizing HDSC components. HDSC shall not be
 * responsible for misuse or illegal use of this software for devices not
 * supported herein. HDSC is providing this software "AS IS" and will
 * not be responsible for issues arising from incorrect user implementation
 * of the software.
 *
 * Disclaimer:
 * HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
 * REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
 * ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
 * WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
 * WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
 * WARRANTY OF NONINFRINGEMENT.
 * HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
 * NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
 * LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
 * LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
 * INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
 * INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
 * SAVINGS OR PROFITS,
 * EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
 * YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
 * INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
 * FROM, THE SOFTWARE.
 *
 * This software may be replicated in part or whole for the licensed use,
 * with the restriction that this Disclaimer and Copyright notice must be
 * included with each copy of this software, whether used in part or whole,
 * at all times.
 */
/******************************************************************************/
/** \file flash.h
 **
 ** FLASH 数据结构及API声明.
 **
 ** - 2017-05-02 LuX V1.0
 **
 ******************************************************************************/

#ifndef __FLASH_H__
#define __FLASH_H__

/******************************************************************************/
/* Include files                                                              */
/******************************************************************************/
#include "ddl.h"

/* C binding of definitions if building with C++ compiler */
#ifdef __cplusplus
extern "C"
{
#endif

    /**
     ******************************************************************************
     ** \defgroup FlashGroup Flash Controller (Flash)
     **
     **
     ******************************************************************************/
    //@{

    /******************************************************************************
     * Global type definitions
     ******************************************************************************/
    /**
     ******************************************************************************
     ** \brief Flash中断类型重定义
     *****************************************************************************/
    typedef enum en_flash_int_type
    {
        flash_int0 = 0u, ///< 擦写保护报警中断
        flash_int1 = 1u, ///< 擦写PC地址报警中断
    } en_flash_int_type_t;

    /**
     ******************************************************************************
     ** \brief Redefinition of FLASH register structure
     ******************************************************************************/

    /******************************************************************************
     * Global definitions
     ******************************************************************************/

    /******************************************************************************
     * Local type definitions ('typedef')
     ******************************************************************************/

    /******************************************************************************
     * Global variable definitions ('extern')
     ******************************************************************************/

    /******************************************************************************
     * Global function prototypes (definition in C source)
     ******************************************************************************/
    // 中断相关函数
    // 中断标志获取
    boolean_t Flash_GetIntFlag(en_flash_int_type_t enFlashIntType);
    // 中断标志清除
    en_result_t Flash_ClearIntFlag(en_flash_int_type_t enFlashIntType);
    // 中断使能/禁止
    en_result_t Flash_EnableIrq(en_flash_int_type_t enFlashIntType);
    en_result_t Flash_DisableIrq(en_flash_int_type_t enFlashIntType);

    /* Flash 初始化配置 */
    en_result_t Flash_Init(func_ptr_t pfnFlashCb, uint8_t u8FreqCfg);

    /* Flash 字节/半字/字写 */
    en_result_t Flash_WriteByte(uint32_t u32Addr, uint8_t u8Data);
    en_result_t Flash_WriteHalfWord(uint32_t u32Addr, uint16_t u16Data);
    en_result_t Flash_WriteWord(uint32_t u32Addr, uint32_t u32Data);

    /* Flash 页/全片擦除 */
    en_result_t Flash_SectorErase(uint32_t u32SectorAddr);
    en_result_t Flash_ChipErase(void);

    //////////////////////////////////////////////////////////////////////////////////////

    /**
     * @brief 初始化flash时钟等参数，更改频率后可调用一次进行新参数覆盖
     *
     * @param intr_cb 流程回调函数，填NULL则关闭中断
     * @return en_result_t
     */
    en_result_t flash_init_clk(void (*intr_cb)());

    /**
     * @brief 擦除指定节
     * 
     * @param sector 节0-63
     * @return en_result_t 
     */
    en_result_t flash_sector_erase(uint8_t sector);

    /**
     * @brief 从指定节开始写入指定长度的数据
     * 
     * @param sector 节 0-63
     * @param dat 数据
     * @param size 字节数
     * @return en_result_t 
     */
    en_result_t flash_write_bytes(uint8_t sector, uint8_t *dat, size_t size);

    /**
     * @brief 从指定节开始读出指定长度的字节
     * 
     * @param sector 节0-63
     * @param dat 数据缓存
     * @param size 字节数
     * @return en_result_t 
     */
    en_result_t flash_read_bytes(uint8_t sector, uint8_t *dat, size_t size);

    //@} // FlashGroup

#ifdef __cplusplus
}
#endif

#endif /* __FLASH_H__ */
/******************************************************************************/
/* EOF (not truncated)                                                        */
/******************************************************************************/
